package com.xscha.tableforge.repository;

import com.xscha.tableforge.model.entity.NodeMeta;
import org.jooq.DSLContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

import static org.jooq.impl.DSL.max;
import static com.xscha.tableforge.jooq.tables.NodeMetaTable.NODE_META;

@Repository
public class NodeMetaRepository {

    private final DSLContext dsl;

    @Autowired
    public NodeMetaRepository(DSLContext dsl) {
        this.dsl = dsl;
    }

    public List<NodeMeta> findByAppId(String appId) {
        return dsl.selectFrom(NODE_META)
                .where(NODE_META.APP_ID.eq(appId))
                .and(NODE_META.DELETED_TIME.isNull())
                .orderBy(NODE_META.DISPLAY_ORDER.asc())
                .fetch()
                .map(record -> {
                    NodeMeta entity = new NodeMeta();
                    entity.setId(record.get(NODE_META.ID));
                    entity.setAppId(record.get(NODE_META.APP_ID));
                    entity.setParentId(record.get(NODE_META.PARENT_ID));
                    entity.setDisplayOrder(record.get(NODE_META.DISPLAY_ORDER));
                    entity.setNodeId(record.get(NODE_META.NODE_ID));
                    entity.setNodeName(record.get(NODE_META.NODE_NAME));
                    entity.setIcon(record.get(NODE_META.ICON));
                    entity.setNodeType(record.get(NODE_META.NODE_TYPE));
                    entity.setIsVisible(record.get(NODE_META.IS_VISBLE));
                    entity.setExtra(record.get(NODE_META.EXTRA));
                    entity.setPath(record.get(NODE_META.PATH));
                    entity.setCreatedTime(record.get(NODE_META.CREATED_TIME));
                    entity.setCreatedBy(record.get(NODE_META.CREATED_BY));
                    entity.setLastModifiedTime(record.get(NODE_META.LAST_MODIFIED_TIME));
                    entity.setLastModifiedBy(record.get(NODE_META.LAST_MODIFIED_BY));
                    return entity;
                });
    }

    public NodeMeta save(NodeMeta entity) {
        // 如果没有设置显示顺序，则设置为当前最大值+1
        if (entity.getDisplayOrder() == null) {
            Double maxOrder = dsl.select(max(NODE_META.DISPLAY_ORDER))
                    .from(NODE_META)
                    .where(NODE_META.APP_ID.eq(entity.getAppId()))
                    .and(NODE_META.PARENT_ID.eq(entity.getParentId()))
                    .fetchOneInto(Double.class);
            entity.setDisplayOrder(maxOrder != null ? maxOrder + 1 : 1.0);
        }

        // 设置创建时间和创建人
        entity.setCreatedTime(LocalDateTime.now());
        entity.setCreatedBy("system"); // TODO: 从上下文获取当前用户

        // 插入记录
        dsl.insertInto(NODE_META)
                .set(NODE_META.ID, entity.getId())
                .set(NODE_META.APP_ID, entity.getAppId())
                .set(NODE_META.PARENT_ID, entity.getParentId())
                .set(NODE_META.DISPLAY_ORDER, entity.getDisplayOrder())
                .set(NODE_META.NODE_ID, entity.getNodeId())
                .set(NODE_META.NODE_NAME, entity.getNodeName())
                .set(NODE_META.ICON, entity.getIcon())
                .set(NODE_META.NODE_TYPE, entity.getNodeType())
                .set(NODE_META.IS_VISBLE, entity.getIsVisible())
                .set(NODE_META.EXTRA, entity.getExtra())
                .set(NODE_META.PATH, entity.getPath())
                .set(NODE_META.CREATED_TIME, entity.getCreatedTime())
                .set(NODE_META.CREATED_BY, entity.getCreatedBy())
                .execute();

        return entity;
    }

    public NodeMeta update(NodeMeta entity) {
        entity.setLastModifiedTime(LocalDateTime.now());
        entity.setLastModifiedBy("system"); // TODO: 从上下文获取当前用户

        dsl.update(NODE_META)
                .set(NODE_META.NODE_NAME, entity.getNodeName())
                .set(NODE_META.ICON, entity.getIcon())
                .set(NODE_META.IS_VISBLE, entity.getIsVisible())
                .set(NODE_META.EXTRA, entity.getExtra())
                .set(NODE_META.PATH, entity.getPath())
                .set(NODE_META.LAST_MODIFIED_TIME, entity.getLastModifiedTime())
                .set(NODE_META.LAST_MODIFIED_BY, entity.getLastModifiedBy())
                .where(NODE_META.ID.eq(entity.getId()))
                .execute();
                
        return entity;
    }

    public Boolean delete(Long id) {
        return dsl.update(NODE_META)
                .set(NODE_META.DELETED_TIME, LocalDateTime.now())
                .where(NODE_META.ID.eq(id))
                .execute() > 0;
    }

    public Boolean move(Long id, String parentId, Double displayOrder) {
        return dsl.update(NODE_META)
                .set(NODE_META.PARENT_ID, parentId)
                .set(NODE_META.DISPLAY_ORDER, displayOrder)
                .set(NODE_META.LAST_MODIFIED_TIME, LocalDateTime.now())
                .set(NODE_META.LAST_MODIFIED_BY, "system") // TODO: 从上下文获取当前用户
                .where(NODE_META.ID.eq(id))
                .execute() > 0;
    }
} 